package com.crm.base;


import com.crm.utils.BasicEnum;
import com.crm.utils.HttpStatus;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 返回结果
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> implements Serializable {

    /**
     * 响应返回编码
     */
    @ApiModelProperty(value = "状态码")
    private int code;

    /**
     * 响应返回信息
     */
    @ApiModelProperty(value = "状态信息")
    private String msg;

    /**
     * 返回结果数据
     */
    @ApiModelProperty(value = "返回结果")
    private List<T> rows;

    /**
     * 总记录数
     */
    @ApiModelProperty(value = "总记录数")
    private long total;


    /**
     * 创建时间,处理json的时间参数解析
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "操作时间")
    private Date operationTime;

    /**
     * 初始化一个新创建的 ResponseResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    public PageResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public PageResult(int total, List<T> rows) {
        this.total = total;
        this.rows = rows;
    }

    /**
     * 初始化一个新创建的 ResponseResult 对象
     *
     * @param code  状态码
     * @param msg   返回内容
     * @param rows  数据对象
     * @param total 总记录数
     */
    public PageResult(int code, String msg, List<T> rows, long total) {
        this.code = code;
        this.msg = msg;
        this.rows = rows;
        this.total = total;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static PageResult success() {
        return PageResult.success("操作成功", null, 0);
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static PageResult success(List<?> rows, long total) {
        return PageResult.success("查询成功", rows, total);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static PageResult success(String msg) {
        return PageResult.success(msg, null, 0);
    }

    /**
     * 返回成功消息
     *
     * @param msg   返回内容
     * @param rows  数据对象
     * @param total 总记录数
     * @return 成功消息
     */
    public static PageResult success(String msg, List<?> rows, long total) {
        return new PageResult(HttpStatus.SUCCESS, msg, rows, total);
    }

//    //
//    public static PageResult success(List<?> rows) {
//        return new PageResult(HttpStatus.SUCCESS, "查询成功", rows, total);
//    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static PageResult error() {
        return PageResult.error("操作失败", null, 0);
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static PageResult error(String msg) {
        return PageResult.error(msg, null, 0);
    }

    /**
     * 返回错误消息
     *
     * @param msg   返回内容
     * @param rows  数据对象
     * @param total 总记录数
     * @return 警告消息
     */
    public static PageResult error(String msg, List<?> rows, long total) {
        return new PageResult(HttpStatus.ERROR, msg, rows, total);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param code 返回的错误码
     * @return 警告消息
     */
    public static PageResult error(Integer code, String msg) {
        return new PageResult(code, msg, null, 0);
    }

    /**
     * 返回错误消息
     *
     * @param basicEnum 返回内容
     * @return 警告消息
     */
    public static PageResult<Object> error(BasicEnum basicEnum) {
        return new PageResult(basicEnum.getCode(), basicEnum.getMsg(), null, 0);
    }
}
